package com.projles;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Random;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.projles.util.Player;

public class SinestesiaActivity extends Activity implements OnClickListener{
	final int VERDE = 0xFF00FF00;
	final int VERMELHO = 0x00FF0000;
	final int BRANCO = 0xFFFFFFFF;
	final int PRETO = 0x00000000;
	final int AZUL = 0x000055FF; //constantes representando as cores
	final int AMARELO = 0xFFFFFF00;	
	
	private String verde;
	private String vermelho;
	private String azul;
	private String branco;
	private String preto;
	private String amarelo;	    
	
	private Button botaoRodada;
	private Button botao1;
	private Button botao2;
	private Button botao3;
	private Button botao4;
	private Button botao5;
	private Button botao6;
	
	GameButton bt_rodada;
    GameButton bt1;
    GameButton bt2;
    GameButton bt3;
    GameButton bt4;
    GameButton bt5;
    GameButton bt6;
    
    List<Integer> cores = new ArrayList<Integer>();
    List<String> nomes = new ArrayList<String>();
    HashMap<Integer, String> mapa = new HashMap<Integer, String>();
    
    
    private Player player;
    
    private final int TEMPO_LIMITE = 5000;
    private long QTDE_QUADROS_DE_LOADING = 10;
    private final int NUM_RODADAS_DEFAULT = 10;
    
    private int numeroRodadas;
    private Integer rodadaAtual = 0;
    
    private int tempoParcial;
    private int idadeMental;
    
    private CountDownTimer contador;
    
    private TextView mText;
    private TextView novoRecordText;
    
    private TextView mostraRodadas;
    private LinearLayout layoutCronometro;
	private int[] imgsCronometro;
	private int ponteiroCronometro = 0;
	private SharedPreferences config;
	
	private boolean semclick = true;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
	    	
    	super.onCreate(savedInstanceState);
    	setContentView(R.layout.sinestesia);
    	
        config = getSharedPreferences(OpcoesActivity.PREFS_NAME, 0);
        numeroRodadas = config.getInt("num_rodadas", NUM_RODADAS_DEFAULT);
        
        boolean jaUsou = config.getBoolean("ja_usou_cores", false);
        
        if (!jaUsou) {
        	Intent i = new Intent(this, AjudaActivity.class);
        	i.putExtra("qual_jogo", "cores");
        	startActivityForResult(i, 0);
        	
        	rodadaAtual = -1;
        }
        
        SharedPreferences.Editor editor = config.edit();
        editor.putBoolean("ja_usou_cores", true);
        editor.commit();
        
        player = Player.getPlayer(this);
        
        carregaCores();
        carregaViews();
    }
    
    
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
	}
    

	public void onStart(){
		super.onStart();
		
    	setarParametrosIniciais();
    	carregarBotoes();
    	animaEntradaBotoes();
    }

	private void carregaCores() {
		verde = getResources().getString(R.string.verde);
		vermelho = getResources().getString(R.string.vermelho);
		azul = getResources().getString(R.string.azul);
		branco = getResources().getString(R.string.branco);
		preto = getResources().getString(R.string.preto);
		amarelo = getResources().getString(R.string.amarelo);	
	}
	
	private void carregaViews() {
		botaoRodada = (Button) findViewById(R.id.botao_rodada);
        mostraRodadas = (TextView) findViewById(R.id.txt_rodadas);
        
    	botao1 = (Button) findViewById(R.id.button1);
    	botao2 = (Button) findViewById(R.id.button2);
    	botao3 = (Button) findViewById(R.id.button3);
    	botao4 = (Button) findViewById(R.id.button4);
    	botao5 = (Button) findViewById(R.id.button5);
    	botao6 = (Button) findViewById(R.id.button6); 
    
    	botao1.setOnClickListener(this);
    	botao2.setOnClickListener(this);
    	botao3.setOnClickListener(this);
    	botao4.setOnClickListener(this);
    	botao5.setOnClickListener(this);
    	botao6.setOnClickListener(this);
    	
        bt_rodada = new GameButton(botaoRodada);
        bt1 = new GameButton(botao1);
        bt2 = new GameButton(botao2);
        bt3 = new GameButton(botao3);
        bt4 = new GameButton(botao4);
        bt5 = new GameButton(botao5);
        bt6 = new GameButton(botao6);
        
        
	    cores = new ArrayList<Integer>();
	    nomes = new ArrayList<String>();
	    
	    
	    nomes.add(verde);
	    nomes.add(vermelho);
	    nomes.add(azul);
	    nomes.add(branco);
	    nomes.add(preto);
	    nomes.add(amarelo);
	    
	    cores.add(VERDE);
	    cores.add(VERMELHO);
	    cores.add(AZUL);
	    cores.add(BRANCO);
	    cores.add(PRETO);
	    cores.add(AMARELO);
	    
	   
	    mapa.put(VERDE, verde);
	    mapa.put(VERMELHO, vermelho);
	    mapa.put(AZUL, azul);
	    mapa.put(PRETO, preto);
	    mapa.put(BRANCO, branco);
	    mapa.put(AMARELO, amarelo);
	    
	    
	    layoutCronometro = (LinearLayout) findViewById(R.id.layout_cronometro);

        imgsCronometro = new int[]{R.drawable.um,R.drawable.dois, R.drawable.tres, R.drawable.quatro,R.drawable.cinco,R.drawable.seis,R.drawable.sete,R.drawable.oito,R.drawable.nove,R.drawable.dez, R.drawable.onze};
	}
    

    @Override
    protected void onStop() {
    	contador.cancel();
    	super.onStop();
    }
    
	private void carregarBotoes() {
		//contador auxiliar que n permite que mais de um botao tenha a mesma fonte da resposta
    	int aux = 0;
    	//Embaralhar nomes e cores
    	Collections.shuffle(nomes);
    	Collections.shuffle(cores);
    	bt_rodada.setValues(nomes.get(0), cores.get(0), cores.get(1)); //assegura que terah backcolor != fontcolor
    	
    	Collections.shuffle(nomes);
    	Collections.shuffle(cores);
    	
    	
    	//Atribui cores e nomes aos botoes. As cores de background do boto poderao se repetir, das fontes n.
    	
    	
    	do{
    		bt1.setValues(nomes.get(0), cores.get(0)/*back_cores.get(new Random().nextInt(2))*/, cores.get(new Random().nextInt(4)));
    		
    	}while(((aux > 0) && bt1.font_color == bt_rodada.font_color) || (bt1.font_color == bt1.back_color)); //so permite um bot�o com a resposta certa
    	//Trocamos as cores do background se a cor do back for igual ao da fonte
    	
    	
    	do{
    		bt2.setValues(nomes.get(1), cores.get(1)/*back_cores.get(new Random().nextInt(2))*/, cores.get(new Random().nextInt(4)));
    	}while(((aux > 0) && bt2.font_color == bt_rodada.font_color) || (bt2.font_color == bt2.back_color));
    	
    	
    	do{
    		bt3.setValues(nomes.get(2), cores.get(2)/*back_cores.get(new Random().nextInt(2))*/, cores.get(new Random().nextInt(4)));
    	}while(((aux > 0) && bt3.font_color == bt_rodada.font_color) || (bt3.font_color == bt3.back_color));
    	
    
    	do{
    		bt4.setValues(nomes.get(3), cores.get(3)/*back_cores.get(new Random().nextInt(2))*/, cores.get(new Random().nextInt(4)));
    	}while(((aux > 0) && bt4.font_color == bt_rodada.font_color) || (bt4.font_color == bt4.back_color));
    	
    	
    	do{
    		bt5.setValues(nomes.get(4), cores.get(4)/*back_cores.get(new Random().nextInt(2))*/, cores.get(new Random().nextInt(4)));
    	}while(((aux > 0) && bt5.font_color == bt_rodada.font_color) || (bt5.font_color == bt5.back_color));
    	
    	do{
    		bt6.setValues(nomes.get(5), cores.get(5)/*back_cores.get(new Random().nextInt(2))*/, cores.get(new Random().nextInt(4)));
    	}while(((aux > 0) && bt6.font_color == bt_rodada.font_color) || (bt6.font_color == bt6.back_color));
	}

	private void setarParametrosIniciais() {

		rodadaAtual++;
    	mostraRodadas.setText(rodadaAtual+"/"+numeroRodadas);

    	botao1.setEnabled(true);
    	botao2.setEnabled(true);
    	botao3.setEnabled(true);
    	botao4.setEnabled(true);
    	botao5.setEnabled(true);
    	botao6.setEnabled(true);
    	
    	contador = new CountDownTimer(TEMPO_LIMITE, TEMPO_LIMITE/QTDE_QUADROS_DE_LOADING) {
    		

   	     public void onTick(long millisUntilFinished) {
   	    	 tempoParcial += 50;
   	    	 
   	    	 if (ponteiroCronometro == imgsCronometro.length-1) {
   	    		 ponteiroCronometro = 0;
   	    	 }
   	    		 
   	    	 ponteiroCronometro++;
   	    	 layoutCronometro.setBackgroundResource(imgsCronometro[ponteiroCronometro]);
   	     }

   	     public void onFinish() {

   	    	 ponteiroCronometro = 0;
   	    	 layoutCronometro.setBackgroundResource(imgsCronometro[10]);
   	    	 
   	    	 if (rodadaAtual != -1) {
   	    		 
   	    		 idadeMental += (tempoParcial/10)+50;  // ok!
   	    		 
   	    		 if (rodadaAtual == numeroRodadas) {   // fim do jogo
   	    			 motrarResultado();	
   	    		 }
   	    		 
   	    		 onStart();
   	    	 }
   	    	 
   	     }
    	}.start();
	}

   
    private void animaEntradaBotoes() {
    	
    	botaoRodada.setAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in));
    	
    	Animation in = AnimationUtils.makeInAnimation(this, false);
    	botao1.startAnimation(in);
    	in = AnimationUtils.makeInAnimation(this, true);
    	botao2.startAnimation(in);
    	in = AnimationUtils.makeInAnimation(this, false);
    	botao3.startAnimation(in);
    	in = AnimationUtils.makeInAnimation(this, true);
    	botao4.startAnimation(in);
    	in = AnimationUtils.makeInAnimation(this, false);
    	botao5.startAnimation(in);
    	in = AnimationUtils.makeInAnimation(this, true);
    	botao6.startAnimation(in);
	}

    public void onClick(View v){
    	
    	semclick = false;
    	player.click();
    	
    	boolean errou = errou(v);
    	
    	if(errou) {
    		
    		idadeMental += (tempoParcial/10)+15;  // ok!
    		
    		player.erro();
    		v.setEnabled(false);
    	}
    	else {
    		
    		idadeMental += tempoParcial/10;  // ok!
    		
    		contador.cancel();
    		player.acerto();
    		ponteiroCronometro = 0;
    		errou = false;
    	}
    	
    	tempoParcial = 0;
    	
    	
    	if (!errou){
    		
    		if (rodadaAtual == numeroRodadas) {   // fim do jogo
        		motrarResultado();
        	}
    		onStart();
    	}
    	
	}

	private void motrarResultado() {
		idadeMental = idadeMental/numeroRodadas;  // ok!
		
		setContentView(R.layout.resultado);
		mText = (TextView) findViewById(R.id.resultadoIdade);
		
		if (semclick) {
			mText.setText( getResources().getString(R.string.morto) );	
		}
		else {
			mText.setText( idadeMental + "");
		}
		
		mText.setVisibility(View.VISIBLE);
		
		
		if (novoRecord()) {
			player.aplausos();
		    novoRecordText = (TextView) findViewById(R.id.txt_ha_recorde);
		    novoRecordText.setVisibility(View.VISIBLE);
		}
		
		Handler han = new Handler();
		han.postDelayed(new SplashHandler(), 2000);
	}
	


	private boolean errou(View v) {
    	
    	switch (v.getId()) {
		case R.id.button1:
			if(bt1.name.equals(mapa.get(bt_rodada.font_color)))
				return false;
			break;
		
		case R.id.button2:
			if(bt2.name.equals(mapa.get(bt_rodada.font_color)))
				return false;
			break;
			
		case R.id.button3:
			if(bt3.name.equals(mapa.get(bt_rodada.font_color)))
				return false;
			break;
			
		case R.id.button4:
			if(bt4.name.equals(mapa.get(bt_rodada.font_color)))
				return false;
			break;
			
		case R.id.button5:
			if(bt5.name.equals(mapa.get(bt_rodada.font_color)))
				return false;
			break;
			
		case R.id.button6:
			if(bt6.name.equals(mapa.get(bt_rodada.font_color)))
				return false;
			break;
			
		}
    	return true;
    }
    
	private boolean novoRecord() {
		SharedPreferences config = getSharedPreferences(RegistraRecordActivity.RECORDES, 0);
		int maiorIdadeRecord = config.getInt("idade_cinco", Integer.MAX_VALUE);
		
		if (idadeMental < maiorIdadeRecord) {
			return true;
		}
		return false;
	}
	
	
    class SplashHandler implements Runnable {  	
		@Override
		public void run() {
			
			if (novoRecord()) {
				Intent i = new Intent(SinestesiaActivity.this, RegistraRecordActivity.class);
				i.putExtra("novo_record", idadeMental);
				startActivity(i);
			}
	        
			finish();
		}

    }
}




